// ts
// ts语法没有办法直接运行在浏览器端

interface Data {
    x: number,
    y: number,
    c?: boolean // ? 可传可不穿
}

// 基本类型的复制
var a: number = 1; // 类型注解
var b = false; // 类型推断
var c: string = '123';
const obj: Data = { x: 1, y: 2 }; // 类型推断
const arr: (number | string)[] = [1, 2, 3, '4'];
const arrAny: any[] = [1, 2, 3, '4'];
const fun: () => number = () => {
    return 123
}

function demo1(data: Data) {
    return Math.sqrt(data.x ** 2 + data.y ** 2)
}
demo1({ x: 1, y: 1 })




// var one = 1;
// var two = 2;
// var total = one + two;
// 如果TS能够分析变量类型，我们就什么都不需要做了
// 无法解析则需要类型主解
function getTotal(one: number, two: number) {
    return one + two;
}
const total = getTotal(1, 2)



// function add(one: number, two: number): number { // 定义函数必须返回数字
//     return one + two + ""
// }
// const addNumber = add(1, 2)
function add(one: number, two: number): void { // 定义函数必须返回数字
    // void 必须返回空
}

const addNumber = add(1, 2)

function errorEmitteer(one: number, two: number): never { // 永远不可能执行完成
    // throw Error()
    // 或者
    while (true) { }
}
// type 不可以嵌套
type Bbb = {
    id: number
}
// interface 可以嵌套
interface Aaa {
    one: string,
    two: number,
    obj: Bbb
}

// 解构类型注解
function aaa({ one, two, obj }: Aaa) {
    return one + two
}
const aaaa = aaa({ one: 'string', two: 2, obj: { id: 1 } })

const bbb: (str: string) => number = (str) => {
    return Number(str)
}
bbb('1')

interface ArrData {
    name: string,
    age: number,
    phone?: number
}

var arr2: ArrData[] = [
    {
        name: '123',
        age: 18,
        phone: 123
    },
    {
        name: '123',
        age: 18,
        phone: 123
    }
]; // {name: 'kkk',age:18}








var arr3: [number, number, string] = [1, 2, '3']

type Say = {
    message: string,
    name: string
}
interface Person {
    readonly id: number, // 只读： 不能修改
    name?: string,// 非必填
    say(message: string): Say, // 定义一个函数 返回值必须是string
    [propName: string]: any, // 任意一个string的的名字  参数可以是any

}

var obj2: Person = {
    say: (message) => {
        return {
            message: 'jhh',
            name: 'kkk'
        }
    }, id: 1
}
obj2.say('123')